'use strict';

const table = [...'fZodR9XQDSUm21yCkr6zBqiveYah8bt4xsWpHnJE7jL5VG3guMTKNPAwcF'];
const s = [11, 10, 3, 8, 4, 6];
const xor = 177451812;
const add = 8728348608;
const prefix = 'BV';

const encode = (av) => {
    if (isNaN(av)) {
        return '参数类型错误';
    }
    av = parseInt(av) || 0;

    av = (av ^ xor) + add;
    let result = [...prefix + '1  4 1 7  '];
    let i = 0;
    while (i < 6) {
        result[s[i]] = table[Math.floor(av / 58 ** i) % 58];
        i += 1;
    };
    return result.join('');
};

const decode = (bv) => {
    let r = 0;
    for (var i = 0; i < 6; i++) {
        r += table.indexOf(bv[s[i]]) * 58 ** i;
    }
    return r - add ^ xor;
}

console.log(encode(1))
console.log(decode('BV1xx411c7mQ'))